/***************************************************************************
 创建者: 华磊
 开始时间: 2019.11.26
 copyright: (C) 华友高科
 ***************************************************************************/
#include "globalregister.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QFile>
#include <QDebug>
#include "md5check.h"

GlobalRegister::GlobalRegister()
{

}

int  GlobalRegister::initGlobalRegValue()
{

    regRValue.resize(D_ROBOT_REG_SIZE);
    return 1;

}

QVector<double> GlobalRegister::getValues()
{
    usingMutex.lock();
    QVector<double> tmpReturn=regRValue;
    usingMutex.unlock();
    return tmpReturn;
}

int  GlobalRegister::saveRegRValue(int regNumber, double regValue)
{
    usingMutex.lock();
    if(regNumber>=regRValue.size() || regNumber<0)
    {
        qDebug()<<"error,,,GlobalRegister::saveRegRValue regNumber>=regRValue.size() || regNumber<0";
        return 0;
    }
    regRValue[regNumber] = regValue;
    usingMutex.unlock();
    return 1;
}

int GlobalRegister::saveRegRValue(QVector<double> tmpRValue)
{
    usingMutex.lock();
    regRValue = tmpRValue;
    usingMutex.unlock();
    return 1;
}

int GlobalRegister::clearRegRValue()
{
    usingMutex.lock();
    regRValue.fill(0);
    usingMutex.unlock();
    return 1;
}

int GlobalRegister::getRegValue(int index, double &valueOut)
{
    usingMutex.lock();
    if(index>=regRValue.size() || index<0)
    {
        qDebug()<<"error,,,GlobalRegister::saveRegRValue index>=regRValue.size() || index<0";
        return 0;
    }
    valueOut=regRValue[index];
    usingMutex.unlock();
    return 1;
}


int GlobalRegister::writeRegR2File_json(QString filePathIn)
{
    qDebug() << "GlobalManager::writeRegR2File_json"<<filePathIn;

    usingMutex.lock();
    QFile file(filePathIn);
    if(!file.open(QIODevice::WriteOnly| QIODevice::Text))
    {
        //消息预留
        //保存R寄存器数据到文件失败
    }
    else
    {

        QJsonObject obj_root;
        QJsonObject obj_level1;
        QJsonArray arry_itemList;
        obj_level1.insert("size", regRValue.size());

        QString tmpNodeName;
        for(int i=0;i<regRValue.size();i++)
        {
            QJsonObject obj_item;
            tmpNodeName="R"+QString::number(i+1);
            obj_item.insert(tmpNodeName, regRValue[i]);
            arry_itemList.append(obj_item);
        }

        obj_level1.insert("RValue_list", arry_itemList);
        obj_root.insert("regR_info", obj_level1);

        QJsonDocument jsonDoc(obj_root);
        QString tmpString=jsonDoc.toJson();

        //写入内容,这里需要转码，否则报错。
    //    QByteArray str = tmpString.toUtf8();
         QByteArray str = tmpString.toLatin1();
        //写入QByteArray格式字符串
        file.write(str);

        file.close();
        file.flush();//必须加，如果不加，可能关机的时候丢失文件内容。
    }

    MD5Check md5Checker;
    md5Checker.createMd5File(filePathIn);
    usingMutex.unlock();
    return 1;
}



int GlobalRegister::readRegRFile_json(QString filePathIn)
{
    qDebug()<<"GlobalManager::readRegRFile_json"<<filePathIn;
    regRValue.clear();
    int returnFlag=-1;
    QFile file(filePathIn);
    usingMutex.lock();
        if(file.exists())
        {
            if(file.open(QIODevice::ReadOnly))
            {

                QByteArray receiveByteArry = file.read(file.bytesAvailable());
                QJsonParseError jsonError;
                QJsonDocument receiveJsonDoc = QJsonDocument::fromJson(receiveByteArry, &jsonError);
                if(jsonError.error != QJsonParseError::NoError )
                {
                  qDebug() << "readRegRFile_json JsonFile error "<<jsonError.error;
                  usingMutex.unlock();
                  return -2;
                }
                QJsonObject redeiveJsonObj = receiveJsonDoc.object();

                if(false==redeiveJsonObj.contains("regR_info"))
                {
                    usingMutex.unlock();
                    return -3;
                }
                QJsonObject obj_level1=redeiveJsonObj.value("regR_info").toObject();
                if(false==obj_level1.contains("size"))
                {
                    usingMutex.unlock();
                    return -4;
                }
                int size=obj_level1.value("size").toInt();
                if(false==obj_level1.contains("RValue_list"))
                {
                    usingMutex.unlock();
                    return -5;
                }
                QJsonArray arry_itemList=obj_level1.value("RValue_list").toArray();

                if(arry_itemList.size()!=size)
                {
                    usingMutex.unlock();
                    return -6;
                }
                QString tmpNodeName;
                for(int k=0;k<size;k++)
                {
                    double tmp_value;
                    QJsonObject obj_item=arry_itemList[k].toObject();
                    tmpNodeName="R"+QString::number(k+1);
                    if(false==obj_item.contains(tmpNodeName))
                    {
                        usingMutex.unlock();
                        return -100-k;
                    }
                    tmp_value=obj_item[tmpNodeName].toDouble();
//                    regRValue[k]=tmp_value;
                    regRValue.append(tmp_value);
                }


                file.close();
                file.flush();//必须加，如果不加，可能关机的时候丢失文件内容。
            }
            returnFlag= 1;
        }
        else
        {
//            regRValue.resize(REG_SIZE);
            returnFlag= -1;
        }
    usingMutex.unlock();
    return returnFlag;
}
